// 包含OpenCV核心模块头文件，提供基本的数据结构和函数
#include <opencv2/core.hpp>
// 包含OpenCV图像编解码模块头文件，用于读取和保存图像
#include <opencv2/imgcodecs.hpp>
// 包含OpenCV高级图形用户界面模块头文件，用于创建窗口和显示图像
#include <opencv2/highgui.hpp>
// 包含标准输入输出流头文件，用于在控制台输出信息
#include <iostream>

// 使用OpenCV命名空间，避免每次调用OpenCV类和函数时都要加cv::前缀
using namespace cv;
// 使用标准库命名空间，避免每次调用标准库类和函数时都要加std::前缀
using namespace std;

/**
 * @brief 主函数，程序入口
 * @param argc 命令行参数的数量
 * @param argv 命令行参数的数组，其中argv[1] 应为要加载和显示的图像文件路径
 * @return int 程序退出状态码，0表示正常退出，-1表示出现错误
 */
int main( int argc, char** argv )
{
    // 检查命令行参数数量是否正确，如果不等于2则输出使用说明并返回-1
    if( argc != 2)
    {
        // 输出程序的使用说明，提示用户需要提供一个图像文件路径作为参数
        cout <<" Usage: " << argv[0] << " ImageToLoadAndDisplay" << endl;
        return -1;
    }

    // 定义一个Mat对象，用于存储读取的图像数据
    Mat image;
    // 尝试读取用户指定的图像文件，使用IMREAD_COLOR标志以彩色模式读取
    image = imread(argv[1], IMREAD_COLOR); 

    // 检查图像是否成功读取，如果图像为空则输出错误信息并返回-1
    if( image.empty() ) 
    {
        // 输出错误信息，提示无法打开或找到指定的图像文件
        cout << "Could not open or find the image" << std::endl ;
        return -1;
    }

    // 创建一个名为 "Display window" 的窗口，窗口大小会根据显示的图像自动调整
    namedWindow( "Display window", WINDOW_AUTOSIZE ); 
    // 在创建的窗口中显示读取的图像
    imshow( "Display window", image ); 

    // 等待用户按下任意按键，参数0表示无限等待
    waitKey(0); 
    // 程序正常结束，返回0给操作系统
    return 0;
}